iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
0
自我挑戰組

Junior Ruby on Rails 工程師的心得與自我挑戰 30 天 (單身狗轉移注意力之歷練)系列 第 24

[Day24] Ruby on Rails - Timezone Mapping 實作之碰到問題及解法

  • 分享至 

  • xImage
  •  

條件:目前中國大陸是單一時區,因此 Mapping 到的時區一定都要是 GMT+08:00。

情境如下:
在 app/calculators/timezone_calculator.rb 檔案裡:
SINGLE_TIMEZONE_COUNTRIES = %w[NL CZ DE SG HK TW CN KR GB NZ TH IT VN MY JP].freeze

CN 國碼,一定要放進去 SINGLE_TIMEZONE_COUNTRIES 這個變數裡。

之後經過 initialize 初始化完,進入到定義的 perform 方法裡:

def perform
  return timezone_by_country_code if single_timezone?

  finders.each do |klass|
    timezone = klass.new(@params).perform
      return timezone if timezone.present?
    end

  return if @default == false

  @default || DEFAULT_TIMEZONE
end

由於是單一時區,剛好符合第一個條件 return timezone_by_country_code if single_timezone?

return timezone_by_country_code if single_timezone? 這兩個方法,是我們另外宣告的方法,方別為:

def timezone_by_country_code
  ActiveSupport::TimeZone
    .country_zones(@params[:country_code])
    .first
    .tzinfo
    .name
end

因為 if single_timezone? 方法回傳為 true,便會執行 timezone_by_country_code 這個方法,經過gem 'pry-remote'gem 'pry-nav' 這兩個查 Bug 套件檢查:
https://ithelp.ithome.com.tw/upload/images/20191018/20112656tSdiLz5PZj.png
經過了 timezone_by_country_code 這個方法裡面寫好的程式碼去執行,這裡會得到 Urumqi (中國/烏魯木齊)。

def single_timezone?
  return if @params[:country_code].blank?

  SINGLE_TIMEZONE_COUNTRIES.include?(@params[:country_code])
end

這個方法是呼應上面指定 SINGLE_TIMEZONE_COUNTRIES 變數,是否有含單一時區的國碼,這裡回傳是 true,此次範例為國碼 CN。

碰到的問題:
透過以上的程式執行,Timezone 會 Mapping 到一個 "Urumqi": "(GMT+06:00) Asia/Urumqi",但這並不是我們要的,因為所呈現的是 GMT+06:00 的時區中國/烏魯木齊。

針對上述問題,所想到的解決方案:

  1. 把 CN 這個國碼從 SINGLE_TIMEZONE_COUNTRIES = %w[NL CZ DE SG HK TW CN KR GB NZ TH IT VN MY JP].freeze 抽掉,但是目前條件是中國大陸要為單一時區,因此這方法不可行。
  2. 對 config/timezone_choices.yml 檔案的 "Urumqi": "(GMT+06:00) Asia/Urumqi" 直接改成 GMT+08:00,但是這感覺是存粹在 UI 上改,不曉得這方法是否可行 !? 在今日 10/18 10:20 驗證第二點是否可行,答案是不可行,透過 rails c 去檢查存進去的值,就算已改成 GMT+08:00 時區,但跟 local 時間比較的話,只有 6 小時的誤差,正確應為 8 小時誤差才對。
  3. timezone_by_country_code 這個方法裡,判斷 @params[:country_code] 如果是 CN 的話,就把 .first 方法修改為 .last,讓它去吃第二個城市為上海 GMT+08:00 時區

上一篇
[Day23] Ruby on Rails - 使用 Pdfkit 套件來產生 PDF 檔案
下一篇
[Day25] Ruby on Rails - 使用 change_column 碰的的問題分享
系列文
Junior Ruby on Rails 工程師的心得與自我挑戰 30 天 (單身狗轉移注意力之歷練)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
sixwings
iT邦研究生 4 級 ‧ 2019-09-25 00:13:07

加油!

1
King Tzeng
iT邦新手 3 級 ‧ 2019-09-25 00:42:26

XD 再幾天就可以完賽啦!! 加油加油!!/images/emoticon/emoticon47.gif

我要留言

立即登入留言